package com.duckclouddrive.controller;

import java.util.List;

import com.duckclouddrive.annotation.GlobalInterceptor;
import com.duckclouddrive.annotation.VerifyParam;
import com.duckclouddrive.entity.dto.DownloadFileDto;
import com.duckclouddrive.entity.dto.SessionWebUserDto;
import com.duckclouddrive.entity.dto.UploadResultDto;
import com.duckclouddrive.entity.enums.FileCategoryEnums;
import com.duckclouddrive.entity.enums.FileDelFlagEnums;
import com.duckclouddrive.entity.enums.FileFolderTypeEnums;
import com.duckclouddrive.entity.query.FileInfoQuery;
import com.duckclouddrive.entity.po.FileInfo;
import com.duckclouddrive.entity.vo.FileInfoVO;
import com.duckclouddrive.entity.vo.PaginationResultVO;
import com.duckclouddrive.entity.vo.ResponseVO;
import com.duckclouddrive.service.FileInfoService;
import com.duckclouddrive.utils.CopyTools;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.annotation.Id;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 文件信息 Controller
 */
@RestController("fileInfoController")
@RequestMapping("/file")
public class FileInfoController extends CommonFileController{

	@Resource
	private FileInfoService fileInfoService;

	/**
	 * 根据分类加载文件列表
	 *
	 * 此方法用于根据指定的分类参数加载相关的文件信息列表它首先尝试根据传入的分类代码确定文件类别，
	 * 然后构建查询条件，包括从会话中获取的用户ID、排序方式和删除标志最后，它调用文件信息服务的方法来获取分页的文件列表，
	 * 并将结果转换为统一的响应格式返回
	 *
	 * @param session 用户会话，用于获取用户信息
	 * @param query 文件信息查询条件，用于细化搜索结果
	 * @param category 文件类别代码，用于指定要加载的文件类型
	 * @return 返回一个响应对象，包含转换后的分页文件信息列表
	 */
	@RequestMapping("/loadDataList")
	@GlobalInterceptor
	public ResponseVO loadDataList(HttpSession session, FileInfoQuery query, String category) {
	    // 根据分类代码获取对应的枚举对象，用于确定文件类别
	    FileCategoryEnums categoryEnums = FileCategoryEnums.getByCode(category);
	    if (null != categoryEnums) {
	        query.setFileCategory(categoryEnums.getCategory());
	    }
	    // 从会话中获取用户信息，并设置查询的用户ID
	    query.setUserId(getUserInfoFromSession(session).getUserId());
	    // 设置查询结果的排序方式，按照最后更新时间降序排列
	    query.setOrderBy("last_update_time desc");
	    // 设置删除标志，只查询正在使用的文件
	    query.setDelFlag(FileDelFlagEnums.USING.getFlag());
	    // 调用服务方法，根据查询条件获取分页的文件列表结果
	    PaginationResultVO result = fileInfoService.findListByPage(query);
	    // 将结果转换为统一的响应格式，并返回
	    return getSuccessResponseVO(convert2PaginationVO(result, FileInfoVO.class));
	}


	/**
	 * 文件上传接口
	 *
	 * @param session 用户会话，用于获取用户信息
	 * @param fileId 文件ID，唯一标识文件
	 * @param file 上传的文件数据
	 * @param fileName 文件名，需要验证其有效性
	 * @param filePid 文件父ID，用于指定文件的上级目录
	 * @param fileMd5 文件MD5值，用于校验文件完整性
	 * @param chunkIndex 文件分块索引，表示当前上传的是文件的哪一块
	 * @param chunks 文件总块数，表示文件总共分为多少块进行上传
	 * @return 返回上传结果的响应对象
	 */
	@RequestMapping("/uploadFile")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO uploadFile(HttpSession session,
	                             String fileId,
	                             MultipartFile file,
	                             @VerifyParam(required = true) String fileName,
	                             @VerifyParam(required = true) String filePid,
	                             @VerifyParam(required = true) String fileMd5,
	                             @VerifyParam(required = true) Integer chunkIndex,
	                             @VerifyParam(required = true) Integer chunks) {

	    // 从会话中获取用户信息
	    SessionWebUserDto webUserDto = getUserInfoFromSession(session);
	    // 调用文件信息服务完成文件上传
	    UploadResultDto resultDto = fileInfoService.uploadFile(webUserDto, fileId, file, fileName, filePid, fileMd5, chunkIndex, chunks);
	    // 构建并返回成功的响应对象
	    return getSuccessResponseVO(resultDto);
	}
	@RequestMapping("/getImage/{imageFolder}/{imageName}")
	public void getImage(HttpServletResponse response, @PathVariable("imageFolder") String imageFolder, @PathVariable("imageName") String imageName) {
		super.getImage(response, imageFolder, imageName);
	}
	@RequestMapping("/ts/getVideoInfo/{fileId}")
	public void getVideoInfo(HttpServletResponse response, HttpSession session, @PathVariable("fileId") @VerifyParam(required = true) String fileId) {
		// 从会话中获取用户信息
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		// 使用用户ID和文件ID，将文件发送给用户
		super.getFile(response, fileId, webUserDto.getUserId());
	}
	@RequestMapping("/getFile/{fileId}")
	public void getFile(HttpServletResponse response, HttpSession session, @PathVariable("fileId") @VerifyParam(required = true) String fileId) {
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		super.getFile(response, fileId, webUserDto.getUserId());
	}

	@RequestMapping("/newFoloder")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO newFoloder(HttpSession session,
								 @VerifyParam(required = true) String filePid,
								 @VerifyParam(required = true) String fileName) {
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		FileInfo fileInfo = fileInfoService.newFolder(filePid, webUserDto.getUserId(), fileName);
		return getSuccessResponseVO(fileInfo);
	}

	@RequestMapping("/getFolderInfo")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO getFolderInfo(HttpSession session, @VerifyParam(required = true) String path) {
		return super.getFolderInfo(path, getUserInfoFromSession(session).getUserId());
	}
	@RequestMapping("/rename")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO rename(HttpSession session,
							 @VerifyParam(required = true) String fileId,
							 @VerifyParam(required = true) String fileName) {
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		FileInfo fileInfo = fileInfoService.rename(fileName,fileId,webUserDto.getUserId());
		return getSuccessResponseVO(CopyTools.copy(fileInfo,FileInfoVO.class));
	}
	@RequestMapping("/loadAllFolder")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO loadAllFolder(
			                 HttpSession session,
							 @VerifyParam(required = true) String filePid,
							 String currentFileIds) {
         // 从会话中获取用户信息
         SessionWebUserDto webUserDto = getUserInfoFromSession(session);
         // 创建文件信息查询对象
         FileInfoQuery Query = new FileInfoQuery();
         // 设置查询的用户ID
         Query.setUserId(webUserDto.getUserId());
         // 设置查询的文件父ID
         Query.setFilePid(filePid);
		 // 设置文件类型为文件夹
		 Query.setFolderType(FileFolderTypeEnums.FOLDER.getType());
         // 如果当前文件ID列表不为空，则添加排除文件ID条件
         if(!StringUtils.isEmpty(currentFileIds)){
           Query.setExcludeFileIdArray(currentFileIds.split(","));
         }
         // 设置删除标志为使用中
         Query.setDelFlag(FileDelFlagEnums.USING.getFlag());
         // 设置查询排序条件
         Query.setOrderBy("create_time desc");
         // 根据查询条件获取文件信息列表
         List<FileInfo> fileInfoList = fileInfoService.findListByParam(Query);
         // 返回成功响应，其中包含转换后的文件信息VO列表
         return getSuccessResponseVO(CopyTools.copyList(fileInfoList, FileInfoVO.class));
	}

	@RequestMapping("/changeFileFolder")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO changeFileFolder(HttpSession session,
									   @VerifyParam(required = true) String fileIds,
									   @VerifyParam(required = true) String filePid) {
		SessionWebUserDto webUserDto = getUserInfoFromSession(session);
		fileInfoService.changeFileFolder(fileIds, filePid, webUserDto.getUserId());
		return getSuccessResponseVO(null);
	}
	@RequestMapping("/createDownloadUrl/{fileId}")
    @GlobalInterceptor(checkParams = true)
    public ResponseVO createDownloadUrl(HttpSession session, @PathVariable("fileId") @VerifyParam(required = true) String fileId) {
        return super.createDownloadUrl(fileId, getUserInfoFromSession(session).getUserId());
    }
	@RequestMapping("/download/{code}")
	@GlobalInterceptor(checkLogin = false, checkParams = true)
	public void download(HttpServletRequest request, HttpServletResponse response, @PathVariable("code") @VerifyParam(required = true) String code) throws Exception {
		super.download(request, response, code);
	}
	/**
	 * 删除文件到回收站
	 *
	 * 此方法负责将指定的文件删除并移动到回收站它首先从HTTP会话中获取用户信息，
	 * 然后调用文件信息服务中的方法批量删除用户指定的文件
	 *
	 * @param session HTTP会话对象，用于获取用户信息
	 * @param fileIds 要删除的文件ID字符串，多个文件ID以特定分隔符分隔
	 *                通过@VerifyParam注解确保此参数为必填项
	 * @return 返回一个响应对象，表示操作结果由于是删除操作，返回值体为空
	 */
	@RequestMapping("/delFile")
	@GlobalInterceptor(checkParams = true)
	public ResponseVO delFile(HttpSession session, @VerifyParam(required = true) String fileIds) {
	    // 从会话中获取用户信息
	    SessionWebUserDto webUserDto = getUserInfoFromSession(session);
	    // 将用户ID和要删除的文件ID批量移至回收站
	    fileInfoService.removeFile2RecycleBatch(webUserDto.getUserId(), fileIds);
	    // 返回删除成功的响应对象，此处不返回具体数据
	    return getSuccessResponseVO(null);
	}




}